package it.rossignoli.enrico.app.Tesi;

import java.security.SecureRandom;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.InputFilter;
import android.text.Spanned;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class TesiActivity extends Activity {

	private EditText textIp;
	private EditText textSibName;
	private EditText textPort;
	private String nodeID;

	private TextView tt;

	private Intent serviceIntent;
	private ResponseReceiver receiver;
	private IntentFilter filter;
	private ProgressDialog connecting;

	private static final int DIALOG_ERROR_ID = 1;
	private static final int DIALOG_CONFERM_ID = 2;
	private static final int DIALOG_INFO_ID = 3;

	private static final int ITEM_MENU_PREFERENCES = 7;
	private static final int ITEM_MENU_INFO = 8;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		Log.i("ActivityDemo", "Richiamato onCreate() con bundle "
				+ savedInstanceState);

		this.textIp = (EditText) findViewById(R.id.ip);
		this.textSibName = (EditText) findViewById(R.id.sib_name);
		this.textPort = (EditText) findViewById(R.id.port);
		this.textPort.setImeOptions(EditorInfo.IME_ACTION_DONE);

		/* imposto il filtro per l'inserimento di un indirizzo ip */
		InputFilter[] filters = new InputFilter[1];
		filters[0] = new InputFilter() {

			public CharSequence filter(CharSequence source, int start, int end,
					Spanned dest, int dstart, int dend) {
				if (end > start) {
					String destTxt = dest.toString();
					String resultingTxt = destTxt.substring(0, dstart)
							+ source.subSequence(start, end)
							+ destTxt.substring(dend);
					if (!resultingTxt
							.matches("^\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3})?)?)?)?)?)?")) {
						return "";
					} else {
						String[] splits = resultingTxt.split("\\.");
						for (int i = 0; i < splits.length; i++) {
							if (Integer.valueOf(splits[i]) > 255) {
								return "";
							}
						}
					}
				}
				return null;
			}
		};

		this.textIp.setFilters(filters);

		updatePreferencesData();

		// Parte di collegamento al receveir di eventi da SibIntentService
		filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
		filter.addCategory(Intent.CATEGORY_DEFAULT);
		receiver = new ResponseReceiver();
	}

	@Override
	public void onResume() {
		super.onResume();
		updatePreferencesData();
		registerReceiver(receiver, filter);
	}

	@Override
	public void onPause() {
		super.onPause();
		unregisterReceiver(receiver);
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	public void connect(View button) {
		if (this.textIp.getText().toString().equals("")
				|| this.textPort.getText().toString().equals("")
				|| this.textSibName.getText().toString().equals("")) {
			showDialog(DIALOG_ERROR_ID);
		} else {
			showDialog(DIALOG_CONFERM_ID);
		}
	}

	public void SelUtente(View button) {
		// Selezionato quando clicco su seleziona utente

		Intent i = new Intent(TesiActivity.this, Utente.class);
		startActivity(i);
	}

	private void realConnect() {

		SecureRandom r = new SecureRandom();
		this.nodeID = "Node_" + r.nextInt(999999999);

		/*
		 * Se passo i parametri tramite intent questo per� comporta problemi nel
		 * momento in cui il service termina, e quindi viene distrutto i dati
		 * passati non possono essere salvati
		 */

		// serviceIntent = new Intent(this, SibIntentService.class);
		// serviceIntent.putExtra(SibIntentService.PARAM_IN_TYPE,SibIntentService.typeIntent.CONNECT);
		// serviceIntent.putExtra(SibIntentService.PARAM_IN_IP,
		// ((EditText)findViewById(R.id.ip)).getText().toString() );
		// serviceIntent.putExtra(SibIntentService.PARAM_IN_SSNM,
		// ((EditText)findViewById(R.id.sib_name)).getText().toString());
		// serviceIntent.putExtra(SibIntentService.PARAM_IN_PORT,
		// ((EditText)findViewById(R.id.port)).getText().toString());
		// serviceIntent.putExtra(SibIntentService.PARAM_IN_NODEID,
		// this.nodeID);
		// startService(serviceIntent);

		/*
		 * Se utilizzo le sharedpreferences posso salvare i dati delle form e
		 * del nodeid in un gruppo shared e utilizzarli tutte le volte che
		 * voglio nella mia app
		 */

		savePreferences();

		// Richiamo il sibintent service
		serviceIntent = new Intent(this, SibIntentService.class);
		serviceIntent.putExtra(SibIntentService.PARAM_IN_TYPE,
				SibIntentService.typeIntent.CONNECT);
		startService(serviceIntent);

	}

	private void savePreferences() {

		/*
		 * esistono 2 modi di gestire le preferenze nelle applicazioni. il primo
		 * metodo � quello utilizzato qua sotto, che gestisce le preferenze di
		 * "applicazione" ovvero condivise da tutte le activity e service
		 * dell'applicazione stessa. Posso chiaramente limitarne il tipo di
		 * utilizzo zcon il contextmode del metodo di creazione. Inoltre in
		 * questa maniera il primo campo del metodo definisce il nome del gruppo
		 * di preferenze che vado a definire. In un'applicazioni posso infatti
		 * avere piu di un gruppo di preferenze. nel nostro caso diciamo che il
		 * gruppo si chiama preferences_sib e che contiene al suo interno
		 * ip,nome,port e nodeid
		 * 
		 * 
		 * il secondo metodo � quello di usare le prferenze relative
		 * all'activity in uso come si vede nel metodo updatepreferencesdata che
		 * usa le preferenze definite nel file xml pref.xml
		 */
		SharedPreferences prefs = getSharedPreferences("PREFERENCES_SIB",
				Context.MODE_PRIVATE);
		SharedPreferences.Editor editor = prefs.edit();
		if (this.textIp.getText() != null) {
			editor.putString("TEXT_SIBIP", this.textIp.getText().toString());
		}
		if (this.textSibName.getText() != null) {
			editor.putString("TEXT_SIBNAME", this.textSibName.getText()
					.toString());
		}
		if (this.textPort.getText() != null) {
			editor.putString("TEXT_SIBPORT", this.textPort.getText().toString());
		}
		if (this.nodeID != null) {
			editor.putString("TEXT_NODEID", this.nodeID);
		}
		editor.commit();
	}

	public void reset(View button) {
		this.textIp.setText("");
		this.textPort.setText("");
		this.textSibName.setText("");
	}

	private void updatePreferencesData() {
		// Leggiamo le Preferences
		SharedPreferences prefs = PreferenceManager
				.getDefaultSharedPreferences(this);

		if (prefs.getBoolean("flagCheckDataSib", false)) {
			// Leggiamo l'informazione associata alle propriet� con valore key
			// corrispondente a quello indicato nel file pref.xml
			String textip = prefs.getString("textIp", "No Preferences!");
			this.textIp.setText(textip);
			String textSibName = prefs.getString("textSibName",
					"No Preferences!");
			this.textSibName.setText(textSibName);
			String textPort = prefs.getString("textPort", "No Preferences!");
			this.textPort.setText(textPort);
		} else {
			this.textIp.setText("");
			this.textSibName.setText("");
			this.textPort.setText("");
		}
	}

	protected Dialog onCreateDialog(int id) {
		Dialog dialog = null;
		switch (id) {
		case DIALOG_ERROR_ID:
			dialog = createErrorDialog();
			return dialog;
		case DIALOG_CONFERM_ID:
			dialog = createConfirmDialog();
			return dialog;
		case DIALOG_INFO_ID:
			dialog = createInfoDialog();
			return dialog;
		default:
			return null;
		}
	}

	private Dialog createInfoDialog() {
		// Otteniamo il riferimento al Builder
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		// Impostiamo il titolo, il messaggio ed una icona in chaining
		builder.setTitle(R.string.alertDialogInfo_label);
		builder.setIcon(R.drawable.ic_launcher);
		builder.setCancelable(false);
		builder.setMessage(R.string.alertDialogInfo_message);
		// Impostiamo il pulsante di Yes con il relativo listener
		builder.setPositiveButton(R.string.alertDialogInfo_positiveLabel,
				new DialogInterface.OnClickListener() {

					public void onClick(DialogInterface dialog, int id) {
						dialog.dismiss();
					}

				});
		// Ritorniamo l'Alert creato
		return builder.create();
	}

	protected void onPrepareDialog(int id, Dialog dialog) {
		switch (id) {
		case DIALOG_ERROR_ID:
			break;
		case DIALOG_CONFERM_ID:
			tt.setText(getResources().getString(
					R.string.alertDialogConfirm_message)
					+ "\nIP: "
					+ this.textIp.getText().toString()
					+ "\nSSNM: "
					+ this.textSibName.getText().toString()
					+ "\nPORT: "
					+ this.textPort.getText().toString());
			break;
		case DIALOG_INFO_ID:
			break;
		default:
			break;
		}
	}

	private Dialog createErrorDialog() {
		// Otteniamo il riferimento al Builder
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		// Impostiamo il titolo, il messaggio ed una icona in chaining
		builder.setTitle(R.string.alertDialogError_label);
		builder.setIcon(R.drawable.ic_launcher);
		builder.setCancelable(false);
		builder.setMessage(R.string.alertDialogError_message);
		// Impostiamo il pulsante di Yes con il relativo listener
		builder.setPositiveButton(R.string.alertDialogError_positiveLabel,
				new DialogInterface.OnClickListener() {

					public void onClick(DialogInterface dialog, int id) {
						Toast.makeText(TesiActivity.this,
								R.string.alertDialogError_positiveLabel,
								Toast.LENGTH_SHORT).show();
					}

				});
		// Ritorniamo l'Alert creato
		return builder.create();
	}

	private Dialog createConfirmDialog() {

		tt = new TextView(this);
		// Otteniamo il riferimento al Builder
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		// Impostiamo il titolo, il messaggio ed una icona in chaining
		builder.setTitle(R.string.alertDialogConfirm_label);
		builder.setIcon(R.drawable.ic_launcher);
		builder.setCancelable(false);
		tt.setText(getResources()
				.getString(R.string.alertDialogConfirm_message)
				+ "\nIP: "
				+ this.textIp.getText().toString()
				+ "\nSSNM: "
				+ this.textSibName.getText().toString()
				+ "\nPORT: "
				+ this.textPort.getText().toString());
		builder.setView(tt);
		// builder.setMessage(R.string.alertDialogConfirm_message);
		// builder.setMessage(getResources().getString(R.string.alertDialogConfirm_message)+"\nIP: "+this.textIp.getText().toString()+"\nSSNM: "+this.textSibName.getText().toString()+"\nPORT: "+this.textPort.getText().toString());

		// Impostiamo il pulsante di Yes con il relativo listener
		builder.setPositiveButton(R.string.alertDialogConfirm_positiveLabel,
				new DialogInterface.OnClickListener() {

					public void onClick(DialogInterface dialog, int id) {

						connecting = ProgressDialog.show(TesiActivity.this,
								"Connect", "Connecting....", true, true,
								new DialogInterface.OnCancelListener() {

									public void onCancel(DialogInterface dialog) {
										Toast.makeText(TesiActivity.this,
												"Interrupted",
												Toast.LENGTH_LONG).show();

									}

								});
						// Toast.makeText(TesiActivity.this,R.string.alertDialogConfirm_positiveLabel,
						// Toast.LENGTH_SHORT).show();
						realConnect();
					}

				});
		// Impostiamo il pulsante di No con il relativo listener
		builder.setNegativeButton(R.string.alertDialogConfirm_negativeLabel,
				new DialogInterface.OnClickListener() {

					public void onClick(DialogInterface dialog, int id) {
						Toast.makeText(TesiActivity.this,
								R.string.alertDialogConfirm_negativeLabel,
								Toast.LENGTH_SHORT).show();
					}

				});
		// Ritorniamo l'Alert creato
		return builder.create();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		menu.add(Menu.FIRST, ITEM_MENU_PREFERENCES, 1, "Preferences");
		menu.add(Menu.FIRST, ITEM_MENU_INFO, 2, "Info");

		return true;
	}

	public boolean onOptionsItemSelected(MenuItem item) {

		switch (item.getItemId()) {

		case ITEM_MENU_PREFERENCES:
			Intent i = new Intent(this, MyPreferencesActivity.class);
			startActivity(i);
			return true;

		case ITEM_MENU_INFO:
			showDialog(DIALOG_INFO_ID);
			return true;

		default:
			return true;
		}
	}

	private void toast(String text) {
		Toast.makeText(this, text, Toast.LENGTH_LONG).show();
	}

	public class ResponseReceiver extends BroadcastReceiver {
		public static final String ACTION_RESP = "MESSAGE_PROCESSED";

		@Override
		public void onReceive(Context context, Intent intent) {
			// Update UI, new "message" processed by SimpleIntentService
			boolean r = intent.getBooleanExtra(
					SibIntentService.PARAM_OUT_RESULT, false);
			if (r) {
				connecting.dismiss();
				Intent i = new Intent(TesiActivity.this, ListT.class);
				startActivity(i);
				finish();
			} else {
				connecting.dismiss();
				toast("Failed connection!");
			}

		}

	}

}